"""
中高级js逆向案例   混淆   把 函数调用给加密   和你搜索的关键字会不匹配
工具使用 nodepad++   （解决复制js代码位置问题）
https://www.endata.com.cn/BoxOffice/BO/Year/index.html

目的  获取电影 字段 影片名称 ，，，，，

抓 包含数据的数据包

https://www.endata.com.cn/BoxOffice/BO/Year/index.html
https://www.endata.com.cn/BoxOffice/BO/Year/index.html

网页导航栏上的url  不能100%作为 返回数据的url


js逆向意识
在发现network里面没有直接的找到你所要的数据的数据包
就要去找 最可疑的数据包    ajax请求的数据包
 原因（网页会把密文解密成明文返回到网页展示，这个过程不会把数据包放在网络上流通 不会经过 network）

https://www.endata.com.cn/API/GetData.ashx
可疑  王爷没有他展示的数据      考虑逆向


js逆向定位加密解密位置小tips
1 通过搜索url后缀 找到 加密解密位置

逆向过程中
    1.$.ajax({  警觉可能会完成加密操作
    2根据开发者的提示信息 找到加密位置
    3分析简单的业务逻辑
    4打断点失败 新建无痕窗口打断点    可能在检测你在调试
    data = JSON.parse(webInstace.shell(data));
    5JSON.parse 是javascript 数据转换语法 讲 字符串转换为object对象
    typeof(JSON.parse(webInstace.shell(data)))
    'object'
    typeof(webInstace.shell(data))
    'string'
    a={"a":"dsa"}
    print(type(a))
    dd=str(a)
    print(type(dd))

    6在从函数调用位置进入定义函数位置时 没有跳转大定义位置 重新进入
    7进入定义位置 发现是 this[_0x2246('0x257', 'nArV')] = function(_0xa0c834)
        这是 javascript里面的构造函数的写法 作用（可以实例化对象）等同于 python的类  类可以实例化对象
    8_0x2246 is not defined
        搜索的时候 加上空格 缩小范围
    9遇到自执行函数 要注意经量扣 （是否有调用你调试过程中没有定义的变量）
        自执行函数即不需要进行调用的函数  即js文件一运行 就直接执行代码的 函数
    10 navigator is not define 直接加上 navigator={}
    11当一个变量被手动定义  调用调试就没有反应 就要去 搜索这个变量被谁调用了
    12 ||表示 或的意思
    13 this[] 括号里面的东西为什么能写成那样子？ 混淆的特性



datasss = webInstace.shell(data)
data是 https://www.endata.com.cn/API/GetData.ashx 返回数据
根进 webInstace.shell(data) 定义的位置 扣取js代码  让 webInstace.shell调用  完成密文的生成

if (!navigator || !navigator[_0x2246('0x26d', '0I#o')])
    return 'dsadsa';
    给出什么返回什么
所以直接干掉    代码去除 不让其执行
"""

import execjs
import requests

ajaxurl = "https://www.endata.com.cn/API/GetData.ashx"

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36",
    "X-Requested-With": "XMLHttpRequest"
}
data={
    "year": "2022",
"MethodName": "BoxOffice_GetYearInfoData"
}
miwenres=requests.post(ajaxurl,headers=headers,data=data)
midata=(miwenres.text)
with open("艺恩.js", "r", encoding="utf-8")as file1:
    jsdata = file1.read()
# 2通过将读取出来的 js代码 传递给 execjs的compile方法  返回一个 执行器对象
exe = execjs.compile(jsdata)
# 3通过执行器对象执行 js代码里面的call函数   call方法的第二个参数 是传递给 方法的参数
result = exe.call("get", midata)
# 4得到函数抛出的返回值
print(result)
"""
_0x2246 is not defined  缺啥补啥 
"""
